package com.wenge.datagroup.storage.dataprocess;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author：WeiPengCheng
 * @Date：2022-07-27 10:55
 * @desc:51 中文实体识别（实体抽取）
 **/
public class MultilingualEntity {
    private static Logger logger = LoggerFactory.getLogger(MultilingualEntity.class);
    private static String url11;

    public static void main(String[] args) {
        PropertyConfigurator.configure("config/log4j.properties");
        String content =
                "北京时间11月5日消息，休斯敦当地610电台连线采访火箭人事部副总裁格森-罗萨斯，探讨火箭目前的境况。罗萨斯表示姚明的恢复已经步入正轨，但是他也透露球队正在考虑是否减少姚明第二节的出场时间，以进一步提高他的效率";

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("id", "123");
        jsonObject.put("content", "休斯敦当地610电台连线采访火箭人事部副总裁格森-罗萨斯姚明");

        analysis(jsonObject.toJSONString());
    }

    public static void setUrl11(String url11) {
        MultilingualEntity.url11 = url11;
    }

    public static Map analysis(String data) {
        long start = System.currentTimeMillis();
        JSONObject json = new JSONObject();
        json.put("id", "123");
        json.put("content", data);
        OutputStreamWriter out = null;
        BufferedReader br = null;
        String result = "";
        try {
            URL url = new URL(url11);

            //打开和url之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            //设定请求的方法为"POST"，默认是GET
            //post与get的不同之处在于post的参数不是放在URL字串里面，而是放在http请求的正文内。
            conn.setRequestMethod("POST");

            //设置30秒连接超时
            conn.setConnectTimeout(30000);
            //设置30秒读取超时
            conn.setReadTimeout(30000);

            // 设置是否向httpUrlConnection输出，因为这个是post请求，参数要放在http正文内，因此需要设为true, 默认情况下是false;
            conn.setDoOutput(true);
            // 设置是否从httpUrlConnection读入，默认情况下是true;
            conn.setDoInput(true);

            // Post请求不能使用缓存
            conn.setUseCaches(false);

            //设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");  //维持长链接
            conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");

            //连接，从上述url.openConnection()至此的配置必须要在connect之前完成，
            conn.connect();

            /**
             * 下面的三句代码，就是调用第三方http接口
             */
            //获取URLConnection对象对应的输出流
            //此处getOutputStream会隐含的进行connect(即：如同调用上面的connect()方法，所以在开发中不调用上述的connect()也可以)。
            out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
            //发送请求参数即数据
            out.write(json.toJSONString());
            //flush输出流的缓冲
            out.flush();

            /**
             * 下面的代码相当于，获取调用第三方http接口后返回的结果
             */
            //获取URLConnection对象对应的输入流
            InputStream is = conn.getInputStream();
            //构造一个字符流缓存
            br = new BufferedReader(new InputStreamReader(is));
            String str = "";
            while ((str = br.readLine()) != null) {
                result += str;
            }

            HashMap<String, JSONArray> map = new HashMap<>();
            if (JSON.parseObject(result).getString("code").equals("200")) {

                JSONArray jsonArray = JSON
                        .parseObject(result)
                        .getJSONObject("data")
                        .getJSONArray("result");
                for (int i = 0; i < jsonArray.size(); i++) {
                    JSONObject jsonObject = JSON.parseObject(jsonArray.getString(i));

                    String type = jsonObject.getString("type");
                    if (map.containsKey(type)) {
                        map.get(type).add(jsonObject.getString("entity"));
                    } else {
                        JSONArray array = new JSONArray();
                        array.add(jsonObject.getString("entity"));
                        map.put(type, array);
                    }
                }
            }

            System.out.println(map);

            //关闭流
            is.close();
            //断开连接，disconnect是在底层tcp socket链接空闲时才切断，如果正在被其他线程使用就不切断。
            conn.disconnect();
            return map;
        } catch (Exception e) {
            logger.info("实体抽取异常！");
            e.printStackTrace();

        } finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (br != null) {
                    br.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                logger.info("多语言实体抽取接口处理耗时： " + (System.currentTimeMillis() - start) + " ms");
            }
        }
        return null;
    }

}
